/*"setFormData","setDisabled","setFormTxtData","serializeObject"*/
/**
 * @widoc $.fn.setFormData
 * @namespace aux
 * @des 将当前元素中定义了 name 的元素根据 jsonValue 赋值
 * 支持文本框、文本域、单选框、复选框（数组或以“;”分隔的字符串）、下拉框
 * 若元素上定义了 data-valIn，则将使用 .html() 为其赋值
 * 注：jsonValue 中未指定的数据不会更改，即如需清空，需要指定所有 name 并赋空值''
 * @type function
 * @param {object} jsonValue 以 name-val 键值对形式保存的元素值，name 对应表单元素的 name
 */
$.fn.setFormData = function(jsonValue){
    var el = this,
        jqControl, type,// 表单元素，表单元素的 type
        tempApi;// 组件api
    $.each(jsonValue, function(name, ival){
        jqControl = el.find("[name=" + name + "]");
        type = jqControl.attr("type");
        if(typeof ival != 'undefined'){
            if(jqControl.hasClass('wi-date-txt')){// 日期组件
                tempApi = jqControl.parent().data('wiDate');
                tempApi && tempApi.setDate(ival);
            }
            else if(jqControl.hasClass('wi-dp-sel')){// 下拉框组件
                tempApi = jqControl.parent().data('wiDp');
                tempApi && tempApi.select(ival);
            }
            else if(jqControl.hasClass('wi-combo-sel')){// 可写下拉框组件
                tempApi = jqControl.parent().data('wiCombo');
                tempApi && tempApi.fSetVal(ival);
            }
            else if(type == 'checkbox'){
                jqControl.prop('checked', false);// 取消所有选中
                if(typeof ival == 'string'){
                    ival = ival.split(';');
                }
                for(var i = 0, len = ival.length; i < len; i++){
                    jqControl.filter('[value="' + ival[i] + '"]').prop('checked', true);
                }
            }
            else if(type == 'radio'){
                jqControl.prop('checked', false);
                jqControl.filter('[value="' + ival + '"]').prop('checked', true);
            }
            else if(typeof jqControl.attr('data-valIn') !== 'undefined'){
                jqControl.html(ival);
            }
            else{
                jqControl.val(ival);
            }
        }
    })
};
/**
 * @widoc $.fn.setDisabled
 * @namespace aux
 * @des 将当前元素中的 input、textarea、select、button、wi-date、wi-dp、wi-combo 设为只读
 * @type function
 * @param {boolean=} disabled 是否设为 disabled，默认为 true
 */
$.fn.setDisabled = function(disabled){
    var el = $(this);
    var jqTemps, len, i, tempApi;// 日期组件、下拉框组件等辅助参数
    disabled = disabled !== false;
    el.find('input,textarea,select,button').prop('disabled', disabled);
    // 日期组件 - 需要在组件中附加样式并禁用事件
    jqTemps = el.find('.wi-date');
    for(i = 0, len = jqTemps.length; i < len; i++){
        tempApi = jqTemps.eq(i).data('wiDate');
        tempApi && tempApi.setDisabled(disabled);
    }
    // 下拉框组件 - 需要在组件中附加样式并禁用事件
    jqTemps = el.find('.wi-dp');
    for(i = 0, len = jqTemps.length; i < len; i++){
        tempApi = jqTemps.eq(i).data('wiDp');
        tempApi && tempApi.setDisabled(disabled);
    }
    // 可写下拉框组件 - 需要在组件中附加样式并禁用事件
    jqTemps = el.find('.wi-combo');
    for(i = 0, len = jqTemps.length; i < len; i++){
        tempApi = jqTemps.eq(i).data('wiCombo');
        tempApi && tempApi.fSetDisabled(disabled);
    }
};
/**
 * @widoc $.fn.setFormTxtData
 * @namespace aux
 * @des 将当前元素中定义了 name 的元素根据 jsonValue 填充（.html(...)）
 * 将覆盖对应 name 的子元素的内容
 * 注：jsonValue 中未指定的数据不会更改，即如需清空，需要指定所有 name 并赋空值 ''
 * @type function
 * @param {object} jsonValue 以 name-val 键值对形式保存的元素值
 */
$.fn.setFormTxtData = function(jsonValue){
    var el = $(this);
    $.each(jsonValue, function(name, ival){
        el.find("[name=" + name + "]").html(ival);
    });
};
/**
 * @widoc $.fn.serializeObject
 * @namespace aux
 * @des 获取元素中定义了 name 属性的 input、textarea、select 元素的 value。其中若文本框元素上，定义了 data-notrim 属性，则取值时会保留前后空格。
 * @return {Object} obj 返回对象 键值对name-value
 */
$.fn.serializeObject = function(){
    var el = $(this),
        oRes = {};
    var jq, name, type, val,
        jqIpts = el.find('[name]');// 只处理有 name 属性的元素
    var jqCur, tempApi;// 下拉框组件辅助参数
    // input
    $.each(jqIpts.filter('input'), function(){
        jq = $(this);
        name = jq.attr('name');
        type = jq.attr('type');
        val = jq.val();
        if(type == "checkbox"){
            // 复选框 - 数组形式，无选中项不添加到结果中
            if(jq.prop('checked')){
                if(oRes[name] == undefined){
                    oRes[name] = [];
                }
                oRes[name].push(val);
            }
        }
        else if(type == "radio"){
            // 单选框
            if(jq.prop('checked')){
                oRes[name] = val;
            }
        }
        else if(type == 'text' || typeof type == 'undefined'){
            // 文本框 - 若定义了 data-notrim 属性，则会保留前后空格
            oRes[name] = typeof jq.attr('data-notrim') == 'undefined' ?
                val.trim() :
                val;
        }
        else{
            // 普通文本域、日期框组件
            oRes[name] = val;
        }
    });
    // textarea
    $.each(jqIpts.filter('textarea'), function(){
        jq = $(this);
        oRes[jq.attr('name')] = jq.val();
    });
    //// select
    //$.each(jqIpts.filter('select'),function(){
    //    jq=$(this);
    //    oRes[jq.attr('name')]=jq.val();
    //});
    // 下拉框组件
    $.each(el.find('.wi-dp'), function(){
        jqCur = $(this);
        tempApi = jqCur.data('wiDp');
        if(tempApi){
            jq = jqCur.find('.wi-dp-sel');
            name = jq.attr('name');
            val = tempApi.getValue();
            if(val){
                oRes[name] = val;
            }
        }
    });
    // 可写下拉框
    $.each(el.find('.wi-combo'), function(){
        jqCur = $(this);
        tempApi = jqCur.data('wiCombo');
        if(tempApi){
            jq = jqCur.find('.wi-combo-sel');
            name = jq.attr('name');
            val = tempApi.fGetVal();
            if(val){
                oRes[name] = val;
            }
        }
    });
    return oRes;
};